package sir.mix.java;

import controladores.ControladoraDePrazos;
import controladores.ControladoraTransacoes;
import entidades.Util;
import rpc_xml.ServicosServidor;
import java.io.IOException;
import java.rmi.RemoteException;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.server.PropertyHandlerMapping;
import org.apache.xmlrpc.server.XmlRpcServer;
import org.apache.xmlrpc.server.XmlRpcServerConfigImpl;
import org.apache.xmlrpc.webserver.WebServer;

/**
 * Classe principal do programa servidor.
 *
 * @author Lucas Bueno
 * @author Lucas Dissenha Ortolan
 */
public class SirMixJava {

    /**
     * Método inicial do programa servidor, que cria as principais instâncias a
     * serem utilizadas no programa.
     *
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            // Servidor
            WebServer webServer = new WebServer(Util.PORTA_SERVICO);
            XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer();
            PropertyHandlerMapping mapping = new PropertyHandlerMapping();
            mapping.addHandler(Util.NOME_SERVICO, ServicosServidor.class);
            xmlRpcServer.setHandlerMapping(mapping);
            XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl) xmlRpcServer.getConfig();
            serverConfig.setEnabledForExtensions(true);
            serverConfig.setContentLengthOptional(false);
            webServer.start();

        } catch (RemoteException ex) {
            Logger.getLogger(SirMixJava.class.getName()).log(Level.SEVERE, null, ex);
        } catch (XmlRpcException ex) {
            Logger.getLogger(SirMixJava.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(SirMixJava.class.getName()).log(Level.SEVERE, null, ex);
        }
        /*Executa a Thread que verifica se os prazos dos registros de
         * interesse expiraram.
         */
        Executor executor = Executors.newSingleThreadExecutor();
        executor.execute(new ControladoraDePrazos());

        // Mostro a janela  
        Util.janelaPrincipal.setVisible(true);
        
        ControladoraTransacoes controladoraTransacoes = new ControladoraTransacoes();
        controladoraTransacoes.completarTransacoesPossiveis();
    }
}
